package com.example.java.base.concurrency.threadpool;

import com.example.java.base.concurrency.threadpool.task.ExecutorTask;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * CachedThreadPool:CachedThreadPool
 * <p>
 * 创建一个创建新线程需要的，但可用时将重用以前构造的线程的线程池。 这些池通常可提高其执行很多短期异步任务的程序的性能。
 * 调用execute （如果可用）将重用以前构造的线程。 如果没有现有线程可用，一个新的线程将被创建并添加到池中。
 * 尚未使用的60秒的线程将终止并从缓存中删除。因此，保持空闲的时间足够长池不会消耗任何资源。
 * 需要注意的是具有类似性质的，但不同的细节（例如，超时参数）池可以使用被创建ThreadPoolExecutor构造函数。
 *
 * @author zhangxiaoxiang
 * @date 2020/11/5
 */
public class A6CachedThreadPool {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        //i的最大值和idea jvm启动参数配合
        for (int i = 0; i < 10000; i++) {
            //CachedThreadPool：允许的创建线程数量为Integer.MAX_VALUE，可能会创建大量的线程，从而导致OOM。
            //Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "pool-1-thread-6086"
            executorService.execute(new ExecutorTask());
        }
    }
}
